// 这个文件是对ajax进行二次封装
// 额外的让axios发请求的时候,具有其他功能
// 配置基础路径和超时限制
// 添加进度条信息 ---npgoress
// 返回的响应不再从date属性当中拿数据,而是响应就是我们要的数据
// 统一处理请求错误, 具体请求也可以选择处理或者不处理
import axios from 'axios'
import NProgress from 'nprogress'; //引入js
import 'nprogress/nprogress.css'  // 引入 css

// 以后只要是对axios二次封装, 不会再axios设上直接去封装, 而是创建一个新的axios实例进行封装
// axios.create() 创建一个新的和axios具有想用功能的一个实例
const service = axios.create({
    // 配置基础路径和超时时间
    baseURL:'/mock', // 设置, 当前项目中所有接口路径的公共路径, 基础路径
    timeout:20000, // 当ajax请求超过设置的这个时间就会报错
});

// 添加进度条信息功能, nprogress
// 以后如果想对axios添加额外的功能或者是给请求头添加额外的信息
// 必须用到axios的请求拦截器和响应拦截器 Interceptors

// 请求拦截器
service.interceptors.request.use(
    // 请求拦截器中成功的回调
    (config)=>{
        // config 其实就是我们的请求报文
        // 这个请求报文, 最后一定要返回来, 因为还要继续往下走
        // 在这里我们可以添加额外的功能, 也可以给请求头添加额外需要的数据
        NProgress.start(); // 开启进度条

        return config 
    },  
    // 请求拦截器中失败的回调一般不写,因为失败了,就没有下文了
    // ()=>{
    //   //函数体
    // }
);

// 响应拦截器
service.interceptors.response.use(
  // 成功的响应
    (response)=>{
      // resposne 就是我们的响应报文
      // 我们也是可以添加额外的功能或者对响应报文进行处理
      // 返回的响应不再从date属性当中拿数据,而是响应就是我们要的数据
      NProgress.done(); // 停止进度条

      return response.data
    },
  // 失败的响应
    (error)=>{
      NProgress.done(); // 停止进度条
      // 可以统一处理错误
      alert('发送ajax请求失败' + error.message || '位置错误')

      // 统一处理完成之后,这个错误可以让后面继续处理, 也可以不让后面继续处理
      // return Promise.reject(new Error('发送ajax请求失败'))
      // 如果后面想处理,就返回失败的Promise
      // 如果不想后面处理,就返回一个pending状态的Promise,中断Promise
      return new Promise(()=>{})
    }
);

// 把封装好的axios实例 暴露出去
export default service